"""
【函数】
"""
"""
【函数】

    1、函数的多返回值
        语法：
            def test():
                return 1, 2
            接收时用多个变量接收：x, y = test()
            这里x接收到1，y接收到2，【支持不同类型的数据的return】 
    
    2、函数多种传参方式
        (1)位置参数
            调用函数时，根据函数定义的参数位置来传递参数
        (2)关键字参数
            函数调用时通过“键 = 值”的形式传递参数
        (3)不定长参数
            也叫可变参数，用于不确定调用的时候会传递多少个参数的场景（不传参也可以）
        (4)缺省参数
            也叫默认参数，用于定义函数，为参数提供默认值，调用函数时不用传该默认参数的值
            【注意】所有位置参数必须出现在默认参数前面，包括函数定义和调用！
    
    3、匿名函数
        (1)函数作为参数传递
            传入的是计算逻辑，而非数据
        (2)lambda匿名函数
            def定义的函数是带有名称的函数，lambda关键字可以定义无名称的函数
"""

name = "zhu chen hua"
age = 23
gender = 1


def test(name, age, gender):
    print(f"{name},\t{age},\t{gender}")


# 位置传参
test("zhang", 12, 1)
# 关键字传参
test(age=21, gender=1, name="zhu")
test(gender="女", age=23, name="wang")


# 不定长传参
# 传进来的所有参数都会被args变量收集，它会根据传进参数的位置合并为一个元组，args是元组类型，是位置传参
def test3(*args):
    print(f"{name},\t{age},\t{gender}")


# 参数是“键=值”形式的情况下，所有的“键=值”都会被kwargs接收，同时会根据“键=值”组成字典，是关键字传参
def test4(**kwargs):
    print(f"{name},\t{age},\t{gender}")


# 缺省传参（这里gender默认值是“男”）
def test2(name, age, gender="男"):
    print(f"{name},\t{age},\t{gender}")


test2("li", 32)  # 这里gender没有传值则为默认值。（如果传了值，那么就变为传入的值）
test2("li", 32, gender="女")


def test_func(compute):
    result = compute(1, 2)
    print(f"{result},\t{type(compute)}")


def compute(i, j):
    return i + j


test_func(compute)

# lambda函数  语法：lambda 传入参数 : 函数体(一行代码)
test_func(lambda x, y: x + y)
